package global

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
)

// InitializeLog ========================================初始化日志====================================
func InitializeLog() {
	// 创建根目录
	createLogDir()

	// 设置日志等级
	setLevel()

	if Config.Log.ShowLine {
		options = append(options, zap.AddCaller())
	}

	// 初始化 zap
	ZapLog = zap.New(getLogCore(), options...)
	//刷新缓冲
	defer ZapLog.Sync()
}

// HasPath ===============================================HasPath 判断文件路径是否存在===============================================
func hasPath(path string) bool {
	_, err := os.Stat(path)
	if err == nil {
		return true
	}
	if os.IsNotExist(err) {
		return false
	}
	return false
}

// ========================================================创建文件========================================================
func createLogDir() {
	//判断 log文件是否存在
	if ok := hasPath(Config.Log.RootDir); !ok {
		//不存在就创建
		_ = os.Mkdir(Config.Log.RootDir, 0755)
	}
}

// ========================================================设置log level等级========================================================
func setLevel() {
	switch Config.Log.Level {
	case "debug":
		level = zap.DebugLevel
		options = append(options, zap.AddStacktrace(level))
	case "info":
		level = zap.InfoLevel
	case "warn":
		level = zap.WarnLevel
	case "error":
		level = zap.ErrorLevel
		options = append(options, zap.AddStacktrace(level))
	case "dpanic":
		level = zap.DPanicLevel
	case "panic":
		level = zap.PanicLevel
	case "fatal":
		level = zap.FatalLevel
	default:
		level = zap.InfoLevel
	}

}

// ========================================================获取日志写入器========================================================
func getLogWriter() zapcore.WriteSyncer {
	file := &lumberjack.Logger{
		Filename:   Config.Log.RootDir + "/" + Config.Log.Filename,
		MaxSize:    Config.Log.MaxSize,
		MaxBackups: Config.Log.MaxBackups,
		MaxAge:     Config.Log.MaxAge,
		Compress:   Config.Log.Compress,
	}
	//写入到log文件
	syncFile := zapcore.AddSync(file)
	return zapcore.NewMultiWriteSyncer(syncFile)
	//打印到控制台
	//syncConsole := zapcore.AddSync(os.Stderr)
	//return zapcore.NewMultiWriteSyncer(syncFile, syncConsole)

}

// ========================================================设置日志格式========================================================
func getLogCore() zapcore.Core {
	var encoder zapcore.Encoder

	// ========================================================调整编码器默认配置 NewProductionEncoderConfig这里创建了zapcore.EncoderConfig 创建了一个编码器
	encoderConfig := zap.NewProductionEncoderConfig()
	////=============================================等同上面======================================================================
	//--------------------------------------------------------------------------------------修改时间编码器
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	//--------------------------------------------------------------------------------------在日志文件中使用大写字母记录日志级别
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
	// ===============================设置编码器 获取全局中管理log的字段format进行判断 设置==============================================
	if Config.Log.Format == "json" {
		encoder = zapcore.NewJSONEncoder(encoderConfig)
	} else {
		encoder = zapcore.NewConsoleEncoder(encoderConfig)
	}
	// ========================================================zapcore.NewCore()需要三个参数========================================================
	//encode 以什么形式写入 json获取其他
	//getLogWriter() 写入的位置
	//level 等级
	return zapcore.NewCore(encoder, getLogWriter(), level)
}
